class ZhiPuAIPlugin extends BaseCustomPlugin {
    // beforeProcess是最先运行的函数，一般在这里检查插件的运行条件
    // 若当前不满足条件，请返回this.utils.stopLoadPluginError，插件将终止运行
    beforeProcess = async () => {
        console.log("AI插件已启动，请自行配置 智谱AI 环境变量ZHIPU_API_KEY");
        console.log("AI插件已启动，请自行配置 DeepSeek 环境变量DEEPSEEK_API_KEY");
    }
    selector = () => '#write [mdtype="heading"]'
    // 返回string，会自动作为<style>插入DOM中
    style = () => `
        #ai-thinking-animation {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            display: none;
            z-index: 9999;
            font-size: 24px;
            color: #333;
            animation: fadeInOut 1.5s ease-in-out infinite;
        }

        @keyframes fadeInOut {
            0% {
                opacity: 0.2;
            }
            50% {
                opacity: 1;
            }
            100% {
                opacity: 0.2;
            }
        }
    `

    // 返回Element类型或者element-string，会自动插入到DOM中
    html = () => `
         <div id="ai-thinking-animation">
            蜗牛学苑AI生成中...
        </div>
    `

    // 注册 hint
    hint = () => "AI问答插件"

    // 注册快捷键
    hotkey = () => [this.config.hotkey_string]

    // process方法会在插件初始化时自动运行
    process = () => {
        // toml文件里的所有配置项都可以通过this.config获取
        // console.log(this.config.console_message)
        // console.log("[helloWorldPlugin]: ", this)
        // console.log(document.querySelector("#hello-world"))  // 获取html()插入的DOM元素
        // document.querySelector("#hello-world").innerText = this.config.show_message
    }

    // 点击右键菜单选项时、键入快捷键时会自动调用callback方法（注意：
    // 如果插件没有callback函数，那么就不会出现在右键菜单中）
    // anchorNode: 调用此插件时，光标所在的Element
    callback = anchorNode => {
        this.initContent();
        let ele = anchorNode;
        const apiUrl = this.config.apiUrl;
        const xhr = new XMLHttpRequest();
        const outerThis = this;
        let lastIndex = 0;
        console.log("环境变量默认是KEY：", eval(this.config.api_key));
        xhr.open('POST', apiUrl, true);
        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.setRequestHeader('Authorization', 'Bearer ' + eval(this.config.api_key));

        const textDecoder = new TextDecoder();
        let accumulatedData = '';

        const thinkingAnimation = document.querySelector("#ai-thinking-animation");
        outerThis.utils.insertElement( thinkingAnimation );
        if (!outerThis.config.stream) {
            thinkingAnimation.style.display = 'block';
        }

        xhr.onreadystatechange = function () {
            //流式接收数据 但是不好要重新处理
            if (xhr.readyState === 3) { // 状态为 3 表示正在接收数据
                // console.log("正在接收数据……",xhr.responseText);
                const newData = xhr.responseText.slice(accumulatedData.length);
                accumulatedData += newData;
                const lines = newData.split('\n');
                for (let line of lines) {
                    if (line.startsWith('data: ')) {
                        const jsonStr = line.slice(6);
                        if (jsonStr && jsonStr !== '[DONE]') {
                            try {
                                const jsonObj = JSON.parse(jsonStr);
                                const content = jsonObj.choices[0].delta.content;
                                if (content) {
                                    if (outerThis.config.stream) {
                                        outerThis.utils.insertText(anchorNode, content, false);
                                    }
                                }
                            } catch (error) {
                                console.error('解析 JSON 数据时出错:', error);
                            }
                        }
                    }
                }
            } else if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    const reulst = JSON.parse(xhr.responseText).choices[0].message.content;
                    //非流式，则最后才写入
                    if (!outerThis.config.stream) {
                        thinkingAnimation.style.display = 'none';
                        outerThis.utils.insertText(anchorNode, reulst);
                    }
                } else {
                    console.error('请求出错，状态码:', xhr.status);
                    if (!outerThis.config.stream) {
                        thinkingAnimation.style.display = 'none';
                    }
                }
            }
        };

        xhr.onerror = function () {
            if (!outerThis.config.stream) {
                thinkingAnimation.style.display = 'none';
            }
        };
        //你复制的内容
        const content = window.getSelection().toString();
        //this.config.cueWord[0],0是产品经理，1是项目经理，2是软件工程师，3是测试工程师，4是优秀编辑 
        console.log("目前提示词是,修改请查看文件(X:/Typora/resources/plugin/global/settings/custom_plugin.user.toml)：", outerThis.config.cueWord);
        const jsonData = [
            { "role": "system", "content": outerThis.config.cueWord },
            { "role": "user", "content": content }
        ];
        var param = { 
            "model": outerThis.config.model, 
            "messages": jsonData, 
            "stream": outerThis.config.stream 
        };  // stream=false为非流式
        xhr.send(JSON.stringify(param));
        outerThis.utils.insertText(outerThis.utils.getAnchorNode().lastElementChild, "\n\nAI回答：\n\n",false);
    } 
    initContent = () => {
        console.log("初始化内容");
        console.log(this);
    }
    
}
module.exports = {
    plugin: ZhiPuAIPlugin,
}